Imports System.Data.SqlClient

Public Class cls_produccion_

    Implements ICloneable

#Region "Variables ..."
    Private int_idproduccion As Integer = 0
    Private dte_fecha As DateTime = New System.DateTime(Now.Year, 1, 1)
    Private int_tiempo As Integer = 0
    Private str_notas As String = ""
    Private int_idregistro As Integer = 0
    Private int_idarticulo As Integer = 0
    Private int_idproceso As Integer = 0
    Private int_idmaquinariatarea As Integer = 0
    Private int_estado As enu_estado
    Private dec_costofinal As Decimal = 0

    Private obj_proceso As cls_proceso_
    Private obj_maquinariatarea As cls_maquinariatarea_
    Private obj_articulo As cls_articulo_

    Private obj_produccionresultado_ As cls_produccionresultado_

    Private obj_PDarticulo_ As cls_PDarticulo_
    Private obj_PDmaquinariatarea_ As cls_PDmaquinariatarea_
    Private obj_PDproceso_ As cls_PDproceso_
    Private obj_produccionexterna As cls_produccionexterna_

    Private obj_produccionentrega_ As cls_produccionentrega_
    Private obj_produccionrecepcion_ As cls_produccionrecepcion_

    Private obj_registro As cls_registro_

    Private col_Items As Collections.Generic.List(Of cls_produccion_) = Nothing

    Public Enum enu_estado As Integer
        Abierta = 0
        Incompleta = 1
        Cerrada = 2
        Cancelada = 3
    End Enum

#End Region

#Region "Propiedades ..."
    ReadOnly Property This
        Get
            Return Me
        End Get
    End Property
    ReadOnly Property ThisDescripcion As String
        Get
            Return Me.ToString
        End Get
    End Property
    ReadOnly Property pKey
        Get
            Return idproduccion
        End Get
    End Property
    Property idproduccion() As Integer
        Get
            idproduccion = int_idproduccion
        End Get
        Set(ByVal value As Integer)
            int_idproduccion = value
        End Set
    End Property
    Property fecha() As DateTime
        Get
            fecha = dte_fecha
        End Get
        Set(ByVal value As DateTime)
            dte_fecha = value
        End Set
    End Property
    Property tiempo() As Integer
        Get
            tiempo = int_tiempo
        End Get
        Set(ByVal value As Integer)
            int_tiempo = value
        End Set
    End Property
    Property notas() As String
        Get
            notas = str_notas
        End Get
        Set(ByVal value As String)
            str_notas = value
        End Set
    End Property
    Property idregistro() As Integer
        Get
            idregistro = int_idregistro
        End Get
        Set(ByVal value As Integer)
            int_idregistro = value
        End Set
    End Property
    Property idarticulo() As Integer
        Get
            idarticulo = int_idarticulo
        End Get
        Set(ByVal value As Integer)
            int_idarticulo = value
        End Set
    End Property
    Property estado As enu_estado
        Get
            estado = int_estado
        End Get
        Set(ByVal value As enu_estado)
            int_estado = value
        End Set
    End Property
    Property idproceso As Integer
        Get
            idproceso = int_idproceso
        End Get
        Set(ByVal value As Integer)
            int_idproceso = value
        End Set
    End Property
    Property idmaquinariatarea As Integer
        Get
            idmaquinariatarea = int_idmaquinariatarea
        End Get
        Set(ByVal value As Integer)
            int_idmaquinariatarea = value
        End Set
    End Property
    Property costofinal As Decimal
        Get
            costofinal = dec_costofinal
        End Get
        Set(ByVal value As Decimal)
            dec_costofinal = value
        End Set
    End Property
    ReadOnly Property externa As Boolean
        Get
            If Not IsNothing(produccionexterna) Then
                Return True
            Else
                Return False
            End If
        End Get
    End Property
    Property produccionresultado_() As cls_produccionresultado_
        Get
            If IsNothing(obj_produccionresultado_) Then
                obj_produccionresultado_ = New cls_produccionresultado_
                If Not obj_produccionresultado_.CargarXidproduccion(idproduccion) Then
                    obj_produccionresultado_ = Nothing
                End If
            End If
            produccionresultado_ = obj_produccionresultado_
        End Get
        Set(ByVal value As cls_produccionresultado_)
            obj_produccionresultado_ = value
        End Set
    End Property
    Property produccionentrega_() As cls_produccionentrega_
        Get
            If IsNothing(obj_produccionentrega_) Then
                obj_produccionentrega_ = New cls_produccionentrega_
                If Not obj_produccionentrega_.CargarXidproduccion(idproduccion) Then
                    obj_produccionentrega_ = Nothing
                End If
            End If
            produccionentrega_ = obj_produccionentrega_
        End Get
        Set(ByVal value As cls_produccionentrega_)
            obj_produccionentrega_ = value
        End Set
    End Property
    Property produccionrecepcion_() As cls_produccionrecepcion_
        Get
            If IsNothing(obj_produccionrecepcion_) Then
                obj_produccionrecepcion_ = New cls_produccionrecepcion_
                If Not obj_produccionrecepcion_.CargarXidproduccion(idproduccion) Then
                    obj_produccionrecepcion_ = Nothing
                End If
            End If
            produccionrecepcion_ = obj_produccionrecepcion_
        End Get
        Set(ByVal value As cls_produccionrecepcion_)
            obj_produccionrecepcion_ = value
        End Set
    End Property
    Property PDproceso_() As cls_PDproceso_
        Get
            If IsNothing(obj_PDproceso_) Then
                obj_PDproceso_ = New cls_PDproceso_
                If Not obj_PDproceso_.CargarXidproduccion(idproduccion) Then
                    obj_PDproceso_ = Nothing
                End If
            End If
            PDproceso_ = obj_PDproceso_
        End Get
        Set(ByVal value As cls_PDproceso_)
            obj_PDproceso_ = value
        End Set
    End Property
    Property PDmaquinariatarea_() As cls_PDmaquinariatarea_
        Get
            If IsNothing(obj_PDmaquinariatarea_) Then
                obj_PDmaquinariatarea_ = New cls_PDmaquinariatarea_
                If Not obj_PDmaquinariatarea_.CargarXidproduccion(idproduccion) Then
                    obj_PDmaquinariatarea_ = Nothing
                End If
            End If
            PDmaquinariatarea_ = obj_PDmaquinariatarea_
        End Get
        Set(ByVal value As cls_PDmaquinariatarea_)
            obj_PDmaquinariatarea_ = value
        End Set
    End Property
    Property PDarticulo_() As cls_PDarticulo_
        Get
            If IsNothing(obj_PDarticulo_) Then
                obj_PDarticulo_ = New cls_PDarticulo_
                If Not obj_PDarticulo_.CargarXidproduccion(idproduccion) Then
                    obj_PDarticulo_ = Nothing
                End If
            End If
            PDarticulo_ = obj_PDarticulo_
        End Get
        Set(ByVal value As cls_PDarticulo_)
            obj_PDarticulo_ = value
        End Set
    End Property
    Public Function PDArticulo_Xidarticulo(ByVal int_idarticulo As Integer) As cls_PDarticulo_
        Dim tmp_Pdarticulo_ As New cls_PDarticulo_
        If Not tmp_Pdarticulo_.CargarXidproduccionXidarticulo(idproduccion, int_idarticulo) Then
            tmp_Pdarticulo_ = Nothing
        End If
        Return tmp_Pdarticulo_
    End Function
    Public Function PDMaquinariatarea_Xidmaquinariatarea(ByVal int_idmaquinariatarea As Integer) As cls_PDmaquinariatarea_
        Dim tmp_Pdmaquinariatarea_ As New cls_PDmaquinariatarea_
        If Not tmp_Pdmaquinariatarea_.CargarXidproduccionXidmaquinariatarea(idproduccion, int_idmaquinariatarea) Then
            tmp_Pdmaquinariatarea_ = Nothing
        End If
        Return tmp_Pdmaquinariatarea_
    End Function
    Property proceso() As cls_proceso_
        Get
            If IsNothing(obj_proceso) Then
                obj_proceso = New cls_proceso_
                If Not obj_proceso.Buscar(idproceso) Then
                    obj_proceso = Nothing
                End If
            End If
            proceso = obj_proceso
        End Get
        Set(ByVal value As cls_proceso_)
            obj_proceso = value
        End Set
    End Property
    Property produccionexterna() As cls_produccionexterna_
        Get
            If IsNothing(obj_produccionexterna) Then
                obj_produccionexterna = New cls_produccionexterna_
                If Not obj_produccionexterna.BuscarXidproduccion(idproduccion) Then
                    obj_produccionexterna = Nothing
                End If
            End If
            produccionexterna = obj_produccionexterna
        End Get
        Set(ByVal value As cls_produccionexterna_)
            obj_produccionexterna = value
        End Set
    End Property
    Property maquinariatarea() As cls_maquinariatarea_
        Get
            If IsNothing(obj_maquinariatarea) Then
                obj_maquinariatarea = New cls_maquinariatarea_
                If Not obj_maquinariatarea.Buscar(idmaquinariatarea) Then
                    obj_maquinariatarea = Nothing
                End If
            End If
            maquinariatarea = obj_maquinariatarea
        End Get
        Set(ByVal value As cls_maquinariatarea_)
            obj_maquinariatarea = value
        End Set
    End Property
    Property articulo() As cls_articulo_
        Get
            If IsNothing(obj_articulo) Then
                obj_articulo = New cls_articulo_
                If Not obj_articulo.Buscar(idarticulo) Then
                    obj_articulo = Nothing
                End If
            End If
            articulo = obj_articulo
        End Get
        Set(ByVal value As cls_articulo_)
            obj_articulo = value
        End Set
    End Property
    Property registro() As cls_registro_
        Get
            If IsNothing(obj_registro) Then
                obj_registro = New cls_registro_
                If Not obj_registro.Buscar(idregistro) Then
                    obj_registro = Nothing
                End If
            End If
            registro = obj_registro
        End Get
        Set(ByVal value As cls_registro_)
            obj_registro = value
        End Set
    End Property
    Property Items() As Collections.Generic.List(Of cls_produccion_)
        Get
            Items = col_Items
        End Get
        Set(ByVal value As Collections.Generic.List(Of cls_produccion_))
            col_Items = value
        End Set
    End Property
#End Region

    Public Overrides Function ToString() As String
        Return idproduccion & " - " & articulo.ToString
    End Function
    Private Sub CargarColeccion(ByVal obj_Reader As SqlDataReader)
        col_Items = New Collections.Generic.List(Of cls_produccion_)
        While obj_Reader.Read()
            Dim Elemento As New cls_produccion_
            Elemento.int_idproduccion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idproduccion")))

            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha"))) = False Then
                Elemento.dte_fecha = (obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tiempo"))) = False Then
                Elemento.int_tiempo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tiempo")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("notas"))) = False Then
                Elemento.str_notas = (obj_Reader.GetValue(obj_Reader.GetOrdinal("notas")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro"))) = False Then
                Elemento.int_idregistro = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idarticulo"))) = False Then
                Elemento.int_idarticulo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idarticulo")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("estado"))) = False Then
                Elemento.int_estado = (obj_Reader.GetValue(obj_Reader.GetOrdinal("estado")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idproceso"))) = False Then
                Elemento.int_idproceso = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idproceso")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idmaquinariatarea"))) = False Then
                Elemento.int_idmaquinariatarea = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idmaquinariatarea")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("costofinal"))) = False Then
                Elemento.dec_costofinal = (obj_Reader.GetValue(obj_Reader.GetOrdinal("costofinal")))
            End If
            col_Items.Add(Elemento)
        End While
    End Sub

    Private Sub CargarVariables(ByVal obj_Reader As SqlDataReader)
        obj_Reader.Read()
        int_idproduccion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idproduccion")))

        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha"))) = False Then
            dte_fecha = (obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tiempo"))) = False Then
            int_tiempo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tiempo")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("notas"))) = False Then
            str_notas = (obj_Reader.GetValue(obj_Reader.GetOrdinal("notas")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro"))) = False Then
            int_idregistro = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idarticulo"))) = False Then
            int_idarticulo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idarticulo")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("estado"))) = False Then
            int_estado = (obj_Reader.GetValue(obj_Reader.GetOrdinal("estado")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idproceso"))) = False Then
            int_idproceso = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idproceso")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idmaquinariatarea"))) = False Then
            int_idmaquinariatarea = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idmaquinariatarea")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("costofinal"))) = False Then
            dec_costofinal = (obj_Reader.GetValue(obj_Reader.GetOrdinal("costofinal")))
        End If
    End Sub

    Public Function Nuevo(Optional ByVal ObtenerID As Boolean = False) As Boolean
        Nuevo = False
        Dim obj_Conexion As New cls_Conexion
        Try

            'Creacion de registro----------------------------------------------------
            If IsNothing(obj_registro) Then
                registro = New cls_registro_
                registro.fechacreado = Now
                registro.idusuariocreado = UsuarioLOG.idusuario
                registro.fechamodificado = Now
                registro.idusuariomodificado = UsuarioLOG.idusuario
                registro.idregistroestado = 1
                registro.idusuarioregistroestado = UsuarioLOG.idusuario
                registro.Nuevo(True)
                idregistro = obj_registro.idregistro
            End If
            '------------------------------------------------------------------------

            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "produccion__Nuevo"
                .Parameters.Add("@fecha", SqlDbType.DateTime).Value = dte_fecha
                .Parameters.Add("@tiempo", SqlDbType.Int).Value = int_tiempo
                .Parameters.Add("@notas", SqlDbType.NVarChar).Value = str_notas
                .Parameters.Add("@idregistro", SqlDbType.Int).Value = int_idregistro
                .Parameters.Add("@idarticulo", SqlDbType.Int).Value = IIf(int_idarticulo = 0, DBNull.Value, int_idarticulo)
                .Parameters.Add("@estado", SqlDbType.Int).Value = int_estado
                .Parameters.Add("@idproceso", SqlDbType.Int).Value = IIf(int_idproceso = 0, DBNull.Value, int_idproceso)
                .Parameters.Add("@idmaquinariatarea", SqlDbType.Int).Value = IIf(int_idmaquinariatarea = 0, DBNull.Value, int_idmaquinariatarea)
                .Parameters.Add("@costofinal", SqlDbType.Decimal).Value = dec_costofinal
                .ExecuteNonQuery()
            End With
            Nuevo = True
            CargarUltimo()

            'Creacion de produccion detalle--------------------------------------------------
            If Not IsNothing(PDarticulo_) Then
                If Not IsNothing(PDarticulo_.Items) Then
                    For Each pdarticulo As cls_PDarticulo_ In PDarticulo_.Items
                        pdarticulo.idproduccion = idproduccion
                        pdarticulo.Nuevo(True)
                    Next
                End If
            End If
            If Not IsNothing(PDmaquinariatarea_) Then
                If Not IsNothing(PDmaquinariatarea_.Items) Then
                    For Each PDmaquinariatarea As cls_PDmaquinariatarea_ In PDmaquinariatarea_.Items
                        PDmaquinariatarea.idproduccion = idproduccion
                        PDmaquinariatarea.Nuevo(True)
                    Next
                End If
            End If
            If Not IsNothing(PDproceso_) Then
                If Not IsNothing(PDproceso_.Items) Then
                    For Each PDproceso As cls_PDproceso_ In PDproceso_.Items
                        PDproceso.idproduccion = idproduccion
                        PDproceso.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion de produccionresultado--------------------------------------------------
            If Not IsNothing(produccionresultado_) Then
                If Not IsNothing(produccionresultado_.Items) Then
                    For Each produccionresultado As cls_produccionresultado_ In produccionresultado_.Items
                        produccionresultado.idproduccion = idproduccion
                        produccionresultado.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion de produccionrecepcion--------------------------------------------------
            If Not IsNothing(produccionrecepcion_) Then
                If Not IsNothing(produccionrecepcion_.Items) Then
                    For Each produccionrecepcion As cls_produccionrecepcion_ In produccionrecepcion_.Items
                        produccionrecepcion.idproduccion = idproduccion
                        produccionrecepcion.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion de produccionentrega--------------------------------------------------
            If Not IsNothing(produccionentrega_) Then
                If Not IsNothing(produccionentrega_.Items) Then
                    For Each produccionentrega As cls_produccionentrega_ In produccionentrega_.Items
                        produccionentrega.idproduccion = idproduccion
                        produccionentrega.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion de produccion externa--------------------------------------------------
            If Not IsNothing(produccionexterna) Then
                produccionexterna.idproduccion = idproduccion
                produccionexterna.Nuevo(True)
            End If
            '-------------------------------------------------------------------------

        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Crear el registro de produccion_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Function

    Public Sub Modificar()
        Dim obj_Conexion As New cls_Conexion
        Try
            'Modificacion de registro------------------------------------------------
            registro.fechamodificado = Now : registro.idusuariomodificado = UsuarioLOG.idusuario
            registro.Modificar()
            '------------------------------------------------------------------------

            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "produccion__Modificar"
                .Parameters.Add("@idproduccion", SqlDbType.Int).Value = int_idproduccion
                .Parameters.Add("@fecha", SqlDbType.DateTime).Value = dte_fecha
                .Parameters.Add("@tiempo", SqlDbType.Int).Value = int_tiempo
                .Parameters.Add("@notas", SqlDbType.NVarChar).Value = str_notas
                .Parameters.Add("@idregistro", SqlDbType.Int).Value = int_idregistro
                .Parameters.Add("@idarticulo", SqlDbType.Int).Value = IIf(int_idarticulo = 0, DBNull.Value, int_idarticulo)
                .Parameters.Add("@estado", SqlDbType.Int).Value = int_estado
                .Parameters.Add("@idproceso", SqlDbType.Int).Value = IIf(int_idproceso = 0, DBNull.Value, int_idproceso)
                .Parameters.Add("@idmaquinariatarea", SqlDbType.Int).Value = IIf(int_idmaquinariatarea = 0, DBNull.Value, int_idmaquinariatarea)
                .Parameters.Add("@costofinal", SqlDbType.Decimal).Value = dec_costofinal
                .ExecuteNonQuery()
            End With

            'Creacion de produccion detalle--------------------------------------------------
            If Not IsNothing(PDarticulo_) Then
                If Not IsNothing(PDarticulo_.Items) Then
                    For Each pdarticulo As cls_PDarticulo_ In PDarticulo_.Items
                        If pdarticulo.idPDarticulo = 0 Then
                            pdarticulo.idproduccion = idproduccion
                            pdarticulo.Nuevo(True)
                        Else
                            pdarticulo.Modificar()
                        End If
                    Next
                End If
            End If
            If Not IsNothing(PDmaquinariatarea_) Then
                If Not IsNothing(PDmaquinariatarea_.Items) Then
                    For Each PDmaquinariatarea As cls_PDmaquinariatarea_ In PDmaquinariatarea_.Items
                        If PDmaquinariatarea.idPDmaquinariatarea = 0 Then
                            PDmaquinariatarea.idproduccion = idproduccion
                            PDmaquinariatarea.Nuevo(True)
                        Else
                            PDmaquinariatarea.Modificar()
                        End If
                    Next
                End If
            End If
            If Not IsNothing(PDproceso_) Then
                If Not IsNothing(PDproceso_.Items) Then
                    For Each PDproceso As cls_PDproceso_ In PDproceso_.Items
                        If PDproceso.idPDproceso = 0 Then
                            PDproceso.idproduccion = idproduccion
                            PDproceso.Nuevo(True)
                        Else
                            PDproceso.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------


            'Creacion/modificacion de produccionresultado-------------------------------------
            If Not IsNothing(produccionresultado_) Then
                If Not IsNothing(produccionresultado_.Items) Then
                    For Each produccionresultado As cls_produccionresultado_ In produccionresultado_.Items
                        If produccionresultado.idproduccionresultado = 0 Then
                            produccionresultado.idproduccion = idproduccion
                            produccionresultado.Nuevo(True)
                        Else
                            produccionresultado.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion/modificacion de produccionentrega-------------------------------------
            If Not IsNothing(produccionentrega_) Then
                If Not IsNothing(produccionentrega_.Items) Then
                    For Each produccionentrega As cls_produccionentrega_ In produccionentrega_.Items
                        If produccionentrega.idproduccionentrega = 0 Then
                            produccionentrega.idproduccion = idproduccion
                            produccionentrega.Nuevo(True)
                        Else
                            produccionentrega.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion/modificacion de produccionrecepcion-------------------------------------
            If Not IsNothing(produccionrecepcion_) Then
                If Not IsNothing(produccionrecepcion_.Items) Then
                    For Each produccionrecepcion As cls_produccionrecepcion_ In produccionrecepcion_.Items
                        If produccionrecepcion.idproduccionrecepcion = 0 Then
                            produccionrecepcion.idproduccion = idproduccion
                            produccionrecepcion.Nuevo(True)
                        Else
                            produccionrecepcion.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion de produccion externa--------------------------------------------------
            If Not IsNothing(produccionexterna) Then
                produccionexterna.idproduccion = idproduccion
                If produccionexterna.idproduccionexterna = 0 Then
                    produccionexterna.Nuevo()
                Else
                    produccionexterna.Modificar()
                End If
            End If
            '-------------------------------------------------------------------------

        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Modificar el registro de produccion_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Sub

    Public Sub Eliminar(ByVal idproduccion As Integer)
        Dim obj_Conexion As New cls_Conexion
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "produccion__Eliminar"
                .Parameters.Add("@idproduccion", SqlDbType.Int).Value = idproduccion
                .ExecuteNonQuery()
            End With
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Eliminar el registro de produccion_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Sub

    Public Function Buscar(ByVal idproduccion As Integer) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            Buscar = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "produccion__Buscar"
                .Parameters.Add("@idproduccion", SqlDbType.Int).Value = idproduccion
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
                Buscar = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Buscar el registro de produccion_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Sub CargarUltimo()
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "produccion__CargarUltimo"
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarUltimo registro de produccion_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Sub

    Public Function CargarTodos() As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarTodos = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "produccion__CargarTodos"
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarTodos = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarTodos los registros de produccion_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim obj_produccion_Clon As New cls_produccion_
        obj_produccion_Clon.int_idproduccion = Me.int_idproduccion
        obj_produccion_Clon.dte_fecha = Me.dte_fecha
        obj_produccion_Clon.int_tiempo = Me.int_tiempo
        obj_produccion_Clon.str_notas = Me.str_notas
        obj_produccion_Clon.int_idregistro = Me.int_idregistro
        obj_produccion_Clon.int_idarticulo = Me.int_idarticulo
        obj_produccion_Clon.int_estado = Me.int_estado
        obj_produccion_Clon.int_idproceso = Me.int_idproceso
        obj_produccion_Clon.int_idmaquinariatarea = Me.int_idmaquinariatarea
        obj_produccion_Clon.dec_costofinal = Me.dec_costofinal
        obj_produccion_Clon.col_Items = Me.col_Items
        Return obj_produccion_Clon
    End Function

    Public Function CargarXidarticulo(ByVal int_idarticulo As Integer) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarXidarticulo = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "produccion__CargarXidarticulo"
                .Parameters.Add("@idarticulo", SqlDbType.Int).Value = int_idarticulo
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarXidarticulo = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarXidarticulo los registros de produccion_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function
    ''' <summary>
    ''' devuelve la cantidad del resultado producido en la produccion del articulo seleccionado a producir si existe, sino devuelve 0.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function produccionresultadoarticulo() As Decimal
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            produccionresultadoarticulo = 0
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "produccion__produccionresultadoarticulo"
                .Parameters.Add("@idarticulo", SqlDbType.Int).Value = int_idarticulo
                .Parameters.Add("@idproduccion", SqlDbType.Int).Value = int_idproduccion
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                obj_Reader.Read()
                If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("cantidad"))) = False Then
                    produccionresultadoarticulo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("cantidad")))
                End If
                'produccionresultadoarticulo = obj_Reader("cantidad")
                obj_Reader.Close()
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al produccionresultadoarticulo los registros de produccion_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function PDProceso_XidProceso(ByVal int_idproceso As Integer) As cls_PDproceso_
        Dim tmp_PdProceso_ As New cls_PDproceso_
        If Not tmp_PdProceso_.CargarXidproduccionXidProceso(idproduccion, int_idproceso) Then
            tmp_PdProceso_ = Nothing
        End If
        Return tmp_PdProceso_
    End Function

End Class
